package org.lanqiao.tjut.testpractice;

import java.util.Arrays;
import java.util.Scanner;
public class testdriver {
	public static void main(String[] args) {
		// 程序主入口

		// 判断年份是否为闰年
		System.out.println("---判断某年是否为闰年---");
		testP0();

		// 求每个月的兔子总对数
		System.out.println("---输出每个月的兔子总对数---");
		Scanner input = new Scanner(System.in);
		System.out.print("请输入月数：");
		int month = input.nextInt(); // 从控制台获取输入月数
		for (int k = 1; k <= month; k++) { // 循环输出从第一月到指定月数每月的兔子总数
			int sumRabbits = rabbits(k);
			System.out.println("第" + k + "个月的兔子总对数为：" + sumRabbits);
		}
		
		//判断101-200之间有多少个素数，并输出所有素数。
		System.out.println("---输出101~200之间的素数---");
		testP1();
		
		
		//打印出所有的 "水仙花数 "
		System.out.println("---输出所有的水仙花数---");
		testP2();
		
	}

	/**
	 * 判断输入年份是否为闰年 满足闰年条件： 1.能被400整除且能被100整除的是闰年 2.能被4整除，但不能被100整除的闰年 其他情况都不是闰年
	 */

	public static void testP0() {
		Scanner input = new Scanner(System.in);
		System.out.print("请输入年份：");

		// 从控制台获取输入年份
		int years = input.nextInt();

		// 能被400整除且能被100整除的是闰年
		// 能被4整除，但不能被100整除的闰年
		if ((years % 400 == 0 && years % 100 == 0) || (years % 4 == 0 && years % 100 != 0)) {
			System.out.println(years + "年是闰年");
		} else {
			System.out.println(years + "年不是闰年"); // 其他情况不是闰年
		}
	}

	/**
	 * 有一对兔子，从出生后第3个月起每个月都生一对兔子， 小兔子长到第三个月后每个月又生一对兔子， 假如兔子都不死， 问每个月的兔子总数为多少？
	 * 输出第一月到指定月数的每月兔子总对数
	 * 
	 * @param n
	 *            数列的第n项，即第n月
	 * @return数列的第n项的值，即第n月的兔子总对数
	 */

	private static int rabbits(int n) {
		// 递归调用结束条件
		if (n == 1 || n == 2) {
			return 1;
		}
		// 第n月的兔子总数等于前两月之和，符合斐波那契数列
		int sumRabbits = rabbits(n - 1) + rabbits(n - 2);
		// 其他情况继续递归调用
		return sumRabbits;

	}
	
	/**
	 * 判断素数的方法：用一个数分别去除2到sqrt(这个数)，如果能被整除， 则表明此数不是素数，反之是素数。   
	 */
	// 方法一：
	private static void testP1() {
		int count = 0;// 从零开始计数
		for (int n = 101; n <= 200; n++) {
			boolean b = false;
			for (int j = 2; j <= Math.sqrt(n); j++) {
				if (n % j == 0 && j != n) {
					b = false;
					break;
				} else {
					b = true;
				}
			}
			if (b == true) {
				count++;
				System.out.print(" " + n);
			}
		}
		System.out.println();
		System.out.println("素数个数是: " + count);
		// 输出给定范围内的所有素数,加强
		System.out.println("---输出numMin~numMax之间的素数---");
		test03();
	}
	
	/**
	 * 打印出所有的 "水仙花数 "，所谓 "水仙花数 "是指一个三位数，其各位数字立方和等于该数本身。
	 * 例如：153是一个 "水仙花数 "，因为153=1的三次方＋5的三次方＋3的三次方。  
	 */

	private static void testP2() {
		int count = 0;// 计数初始化
		for (int n = 100; n < 1000; n++) {
			int i, j, k;
			i = n / 100;// 求出百位的数字
			//(n%100)/10
			j = (n - i * 100) / 10;// 求出十位的数字
			k = n - i * 100 - j * 10;// 求出个位的数字
			int sum = (i * i * i) + (j * j * j) + (k * k * k);
			if (sum == n) {
				System.out.print(" " + n);
				count++;// 没输出一个水仙花数，计数加1

			}
		}
		System.out.println();// 换行
		System.out.println("总共有 - " + count + " - 个水仙花数");// 输出水仙花数的个数
	}
	
	/**
	 *  打印出给定范围以内的素数
	 * 范围为numMin~numMax
	 */
	private static void test03() {
		// 从控制台获取范围
		//创建一个scanner的实例对象，该实例对象的创建需要一个原材料，输入参数system.in
		//使用面向对象的编程思想，就可以调用scanner实例对象的行为，为你完成从控制台输入内容的功能行为.
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个数numMax：");
		int numMax = input.nextInt();
		System.out.println("请输入一个数numMin：");
		int numMin = input.nextInt();
		int count = 0;// 从零开始计数
		// 声明范围从numMin开始，到numMax结束
		for (int n = numMin; n <= numMax; n++) {
			boolean b = false;
			for (int j = 2; j <= n; j++) {
				// 能被j整除且j！=n，则这个数不是素数
				if (n % j == 0 && j != n) {
					b = false;
					break;
				} else {
					b = true;
				}
			}
			if (b == true) {
				count++;
				System.out.print(" " + n);
				System.out.println();
				
			}
		}
		System.out.println();
		System.out.println("素数个数是: " + count);
	}

}


